package com.ideaaedi.springcloud.jd.user.util;

import cn.hutool.core.lang.Assert;
import com.ideaaedi.springcloud.jd.commonds.constant.JdSymbolConstant;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * sys工具类
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img
 * src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.5.B
 */
public final class SysUserUtil {
    
    /**
     * 根据部门路径推断对应的租户值
     *
     * @param deptPath
     *         部门路径
     * @param bizTenantLevel
     *         作为bizTenant的tenant的层级
     *
     * @return 租户值
     */
    @NotNull
    public static String determineTenantByPath(@NonNull String deptPath, int bizTenantLevel) {
        deptPath = deptPath.substring(0, deptPath.length() - 1);
        String[] deptArr = deptPath.split(JdSymbolConstant.COMMA);
        if (deptArr.length <= bizTenantLevel) {
            return deptPath;
        }
        return String.join(",", Arrays.copyOf(deptArr, bizTenantLevel));
    }
    
    /**
     * 当前deptPath（当前tenant）是否可以作为业务租户
     *
     * @param deptPath
     *         部门路径
     * @param bizTenantLevel
     *         作为bizTenant的tenant的层级
     *
     * @return 是否需要将当前部门同步至tenant表
     */
    public static boolean isAsBizTenant(String deptPath, int bizTenantLevel) {
        deptPath = deptPath.substring(0, deptPath.length() - 1);
        return deptPath.split(JdSymbolConstant.COMMA).length == bizTenantLevel;
    }
    
    /**
     * （根据当前租户的情况，必要的话）缩减部门路径
     * <p>
     * 作用：不让用户看到业务租户之上（系统租户）的部门路径
     *
     * @param tenant
     *         用户所属租户
     * @param isBelongBizTenant
     *         tenant是否属于业务租户
     * @param isBelongBizTenant
     *         作为bizTenant的tenant的层级
     * @param deptPathList
     *         要缩减的部门路劲集合
     *
     * @return key - 原部门路径；value - 缩减后部门路径；
     */
    @NonNull
    public static Map<String, String> shrinkDeptPathIfNecessary(@NonNull String tenant, boolean isBelongBizTenant,
             int bizTenantLevel, @Nullable List<String> deptPathList) {
        Objects.requireNonNull(tenant, "tenant cannot be null.");
        if (CollectionUtils.isEmpty(deptPathList)) {
            return Collections.emptyMap();
        }
        Map<String, String> map = new HashMap<>(16);
        if (!isBelongBizTenant) {
            deptPathList.forEach(x -> map.put(x, x));
            return map;
        }
        String[] itemArr = tenant.split(JdSymbolConstant.COMMA);
        String parentBizTenant = String.join(JdSymbolConstant.COMMA, Arrays.copyOf(itemArr, bizTenantLevel - 1));
        Assert.isTrue(StringUtils.isNotBlank(parentBizTenant), "parentBizTenant should not be blank.");
        int prefixPathLength = (parentBizTenant.length() + JdSymbolConstant.COMMA).length();
        for (String deptPath : deptPathList) {
            if (StringUtils.isBlank(deptPath) || !deptPath.startsWith(tenant)) {
                map.put(deptPath, deptPath);
                continue;
            }
            map.put(deptPath, deptPath.substring(prefixPathLength));
        }
        return map;
    }
}
